/**
 Práctica 1 asignatura Desarrollo Aplicaciones Móviles

    -Informática-

Integrantes:  Esperanza González de la Mora & Félix López Garcinuño & José Miguel Bilbao Navas
 */

package capa_interfaz;

import capa_dominio.SuperDate;
import miCartera.MiCartera;
import java.util.Date;
import javax.microedition.lcdui.CustomItem;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Canvas;

public class MiCustomItem extends CustomItem {

    //Tamaño de fila
    private int dy=10;
    private int dyinicial=25;

    //Ancho y alto de la pantalla
    private int alto;
    private int ancho;

    //Filas de nuestra lista
    private int rows;

    //Fila seleccionada
     private int currentY = 0;

     //Array que guarda los colores correspondientes a las filas
     String[] colores;

     //operacion guardada,cuatro estados: 0=hemos bajado en la lista, 1=hemos subido, -1=volvemos a posicion inicial, 2=volvemos a final de la lista
     //y -2==si pintamos por primera vez
     int operacion=-2;

     //Guardo Graphics para repintar
     public Graphics gr;

   
    //Almacenaje de lista de gastos
    private String[] listagastos=null;

    //Referencia a midlet
    private MiCartera midlet;



    public MiCustomItem(String label, String[] gastos, MiCartera midlet){
        super(label);

        listagastos=gastos;
        this.midlet=midlet;
        alto=midlet.pantallainicial.getHeight();
        ancho=midlet.pantallainicial.getWidth();       
        rows=listagastos.length/3;
        colores=new String[listagastos.length/3];
        
    }


    protected int getMinContentHeight() {
        //Da el mínimo alto del área contenido
        return midlet.pantallainicial.getHeight();
    }

    protected int getMinContentWidth() {
        //Da el minimo ancho del área contenido
        return midlet.pantallainicial.getWidth();
    }

    protected int getPrefContentHeight(int width) {
        // Returns the preferred height of the content
        // area. A tentative value for the opposite
        // dimension -- the width -- is passed to aid
        // in the height calculation. The tentative value
        // should be ignored if it is -1.
        return getMinContentHeight();

    }

    protected int getPrefContentWidth(int height) {
        // Returns the preferred width of the content
        // area. A tentative value for the opposite
        // dimension -- the height -- is passed to aid
        // in the width calculation. The tentative value
        // should be ignored if it is -1.

        return getMinContentWidth();

    }

    protected void paint(Graphics g, int w, int h) {
        //Guardamos referencia a Grapchics para hacer método de repaint propio
        this.gr=g;
       
        //Escribimos lineas fijas, establecemos fuente, seleccionamos fuente activa y dibujamos
        Font fuente=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);
        g.setFont(fuente);
        g.setColor(0,0,0);
        g.drawString("Mis gastos", midlet.pantallainicial.getWidth()/2,0 , Graphics.TOP|Graphics.HCENTER );

        //Dibujamos línea separatoria
        g.setColor(0,0,0);//color negro
        g.drawLine(0, dyinicial, ancho, dyinicial);

        //Establezco fecha actual
        Date fechaactual=new Date();

        //Extraigo en milisegundos la fecha actual
        long lfechaactual=fechaactual.getTime();

        //int contadorgastos=1;//contador de gastos que llevo dibujados
        int y=dyinicial;//coordenada "y" que llevo dibujada

        //Dibujo recuadros por cada gasto
        for (int i=0; i<=listagastos.length-1;i=i+3){

            //Extraigo a Date la fecha del gasto
            String fechagasto=listagastos[i]+"-00:00:00.0";//Formato de 21 caracteres para usar parseDate de SuperDate
            Date dategasto=new Date(0);
            SuperDate auxdategasto=new SuperDate();//interfaz para usar parseDate
            dategasto=auxdategasto.parseDate(fechagasto);//Convertimos a Date

            long ldategasto=dategasto.getTime();//Extrae en milisegundos la fecha del gasto

            //Comparo por milisegundos, milisegundos que tiene un mes: 2629800000 ms
            if((lfechaactual-ldategasto)/1000<2629800){
                //Los gastos que se hicieron hace menos de un mes, dibujamos recuadro y escribimos línea
                g.setColor(0,0,0);//negro
                g.drawRect(0,y,ancho,3*dy);//Dibujo rectángulo, sólo borde

                //Guardamos en el array colores el color correspondiente a la fila
                //colores[currentY]="255,255,,255";//blanco para que se dibuje recuadro blanco en repaint
                
                Font fuentegasto=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
                g.setFont(fuentegasto);
                g.setColor(0,0,0);//fuente negra
                g.drawString(listagastos[i], 0, y+dy+dy/2, Graphics.BOTTOM|Graphics.LEFT);
                g.drawString("("+listagastos[i+1]+")", 0, y+2*(dy+dy/2), Graphics.BOTTOM|Graphics.LEFT);
                g.drawString(listagastos[i+2], ancho-3, y+dy+dy, Graphics.BOTTOM|Graphics.RIGHT);

                y=y+3*dy;
                
            }else if((lfechaactual-ldategasto)/1000>=2629800 && (lfechaactual-ldategasto)/1000<7889400){
                //Los gastos que se hicieron hace más de un mes, dibujamos recuadro azul y escribimos línea
                g.setColor(0,0,255);//azul
                g.drawRect(0,y,ancho,3*dy);//Dibujo rectángulo
                g.fillRect(0,y,ancho,3*dy);//Rellenamos de color

                 //Guardamos en el array colores el color correspondiente a la fila
                //colores[currentY]="0,255,,255";//azul

                Font fuentegasto=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
                g.setFont(fuentegasto);
                g.setColor(255,255,255);//blanco
                g.drawString(listagastos[i], 0, y+dy+dy/2, Graphics.BOTTOM|Graphics.LEFT);
                g.drawString("("+listagastos[i+1]+")", 0, y+2*(dy+dy/2), Graphics.BOTTOM|Graphics.LEFT);
                g.drawString(listagastos[i+2], ancho-3, y+dy+dy, Graphics.BOTTOM|Graphics.RIGHT);

                y=y+3*dy;
            //3 meses tienen: 7889400000 ms
            }else if ((lfechaactual-ldategasto)/1000>=7889400){
                //Los gastos que se hicieron hace más de tres meses, dibujamos recuadro rojo y escribimos línea
                g.setColor(255,0,0);//rojo
                g.drawRect(0,y,ancho,3*dy);//Dibujo rectángulo
                g.fillRect(0,y,ancho,3*dy);//Rellenamos de color

                 //Guardamos en el array colores el color correspondiente a la fila
                //colores[currentY]="255,0,,0";

                Font fuentegasto=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
                g.setFont(fuentegasto);
                g.setColor(255,255,255);//blanco
                g.drawString(listagastos[i], 0, y+dy+dy/2, Graphics.BOTTOM|Graphics.LEFT);
                g.drawString("("+listagastos[i+1]+")", 0, y+2*(dy+dy/2), Graphics.BOTTOM|Graphics.LEFT);
                g.drawString(listagastos[i+2], ancho-3, y+dy+dy, Graphics.BOTTOM|Graphics.RIGHT);

                y=y+3*dy;
            }
        }

           //Pinto recuadro de seleeción
           g.setColor(0,255,0);//verde 
           g.drawRect(0,dyinicial+currentY*3*dy,ancho,3*dy);//Dibujo rectángulo
                       
    }

    protected boolean traverse(int dir, int viewportWidth, int viewportHeight, int[] vistRect_inout){
       //El método traverse está definido como integrante de CustomItem, esta clase utiliza los eventos de teclas de la clase Canvas para lograr el desplazamiento por las celdas de la tabla.
         switch (dir) {

            case Canvas.DOWN:

                    if (currentY < (rows - 1)) {

                        currentY++;
                        operacion=0;//hemos bajado
                        
                        repaint(0, dyinicial+currentY*3*dy, ancho, 3*dy);

                        //Cambia posicion de gasto seleccionado en MiCartera
                        midlet.setGastoSeleccionado(currentY);



                    } else {

                        currentY=0;
                        operacion=-1;//volvemos a posicion inicial
                       
                        repaint(0, dyinicial, ancho, dyinicial);
                         //Cambia posicion de gasto seleccionado en MiCartera
                         midlet.setGastoSeleccionado(currentY);

                    }

                break;

            case Canvas.UP:

                    if (currentY > 0) {

                        currentY--;
                        operacion=1;//hemos subido
                       
                        repaint(0, dyinicial+currentY*3*dy, ancho, 3*dy);

                        //Cambia posicion de gasto seleccionado en MiCartera
                        midlet.setGastoSeleccionado(currentY);



                    } else {

                       currentY=rows-1;
                       operacion=2;//volvemos al final de la lista
                       
                       repaint(0, dyinicial+currentY*3*dy, ancho, 3*dy);

                        //Cambia posicion de gasto seleccionado en MiCartera
                        midlet.setGastoSeleccionado(currentY);

                    }

                break;


        }

        return true;

        
    }

    public void pintaDeNuevo(Graphics g){
       
        
        g.translate(0,0);


         //Escribimos lineas fijas, establecemos fuente, seleccionamos fuente activa y dibujamos
        Font fuente=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);
        g.setFont(fuente);
        g.setColor(0,0,0);
        g.drawString("Mis gastos", midlet.pantallainicial.getWidth()/2,0 , Graphics.TOP|Graphics.HCENTER );

        //Dibujamos línea separatoria
        g.setColor(0,0,0);//color negro
        g.drawLine(0, dyinicial, ancho, dyinicial);

        //Establezco fecha actual
        Date fechaactual=new Date();

        //Extraigo en milisegundos la fecha actual
        long lfechaactual=fechaactual.getTime();

        //int contadorgastos=1;//contador de gastos que llevo dibujados
        int y=dyinicial;//coordenada "y" que llevo dibujada

        //Dibujo recuadros por cada gasto
        for (int i=0; i<=listagastos.length-1;i=i+3){

            //Extraigo a Date la fecha del gasto
            String fechagasto=listagastos[i]+"-00:00:00.0";//Formato de 21 caracteres para usar parseDate de SuperDate
            System.out.println("Fecha del gasto:"+fechagasto);
            Date dategasto=new Date(0);
            SuperDate auxdategasto=new SuperDate();//interfaz para usar parseDate
            dategasto=auxdategasto.parseDate(fechagasto);//Convertimos a Date

            long ldategasto=dategasto.getTime();//Extrae en milisegundos la fecha del gasto

            //Comparo por milisegundos, milisegundos que tiene un mes: 2629800000 ms
            if((lfechaactual-ldategasto)/1000<2629800){
                //Los gastos que se hicieron hace menos de un mes, dibujamos recuadro y escribimos línea
                g.setColor(0,0,0);//negro
                g.drawRect(0,y,ancho,3*dy);//Dibujo rectángulo, sólo borde

                //Guardamos en el array colores el color correspondiente a la fila
                //colores[currentY]="255,255,,255";//blanco para que se dibuje recuadro blanco en repaint


                Font fuentegasto=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
                g.setFont(fuentegasto);
                g.setColor(0,0,0);//fuente negra
                g.drawString(listagastos[i], 0, y+dy+dy/2, Graphics.BOTTOM|Graphics.LEFT);
                g.drawString("("+listagastos[i+1]+")", 0, y+2*(dy+dy/2), Graphics.BOTTOM|Graphics.LEFT);
                g.drawString(listagastos[i+2], ancho-3, y+dy+dy, Graphics.BOTTOM|Graphics.RIGHT);

                y=y+3*dy;

            }else if((lfechaactual-ldategasto)/1000>=2629800 && (lfechaactual-ldategasto)/1000<7889400){
                //Los gastos que se hicieron hace más de un mes, dibujamos recuadro azul y escribimos línea
                g.setColor(0,0,255);//azul
                g.drawRect(0,y,ancho,3*dy);//Dibujo rectángulo
                g.fillRect(0,y,ancho,3*dy);//Rellenamos de color

                 //Guardamos en el array colores el color correspondiente a la fila
                //colores[currentY]="0,255,,255";//azul

                Font fuentegasto=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
                g.setFont(fuentegasto);
                g.setColor(255,255,255);//blanco
                g.drawString(listagastos[i], 0, y+dy+dy/2, Graphics.BOTTOM|Graphics.LEFT);
                g.drawString("("+listagastos[i+1]+")", 0, y+2*(dy+dy/2), Graphics.BOTTOM|Graphics.LEFT);
                g.drawString(listagastos[i+2], ancho-3, y+dy+dy, Graphics.BOTTOM|Graphics.RIGHT);

                y=y+3*dy;
            //3 meses tienen: 7889400000 ms
            }else if ((lfechaactual-ldategasto)/1000>=7889400){
                //Los gastos que se hicieron hace más de tres meses, dibujamos recuadro rojo y escribimos línea
                g.setColor(255,0,0);//rojo
                g.drawRect(0,y,ancho,3*dy);//Dibujo rectángulo
                g.fillRect(0,y,ancho,3*dy);//Rellenamos de color

                 //Guardamos en el array colores el color correspondiente a la fila
                //colores[currentY]="255,0,,0";

                Font fuentegasto=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN,Font.SIZE_SMALL);
                g.setFont(fuentegasto);
                g.setColor(255,255,255);//blanco
                g.drawString(listagastos[i], 0, y+dy+dy/2, Graphics.BOTTOM|Graphics.LEFT);
                g.drawString("("+listagastos[i+1]+")", 0, y+2*(dy+dy/2), Graphics.BOTTOM|Graphics.LEFT);
                g.drawString(listagastos[i+2], ancho-3, y+dy+dy, Graphics.BOTTOM|Graphics.RIGHT);

                y=y+3*dy;
            }
        }
        //Pinto recuadro de seleeción
        g.setColor(0,255,0);//verde
        g.drawRect(0,dyinicial+currentY*3*dy,ancho,3*dy);//Dibujo rectángulo
    }

    public void setListaGastos(String[] listanueva){
        this.listagastos=listanueva;
        rows=listanueva.length/3;        
        colores=new String[listagastos.length/3];
    }





}
       
